#include <iostream>
#include <cstring>
#include "DynamicArray.hpp"

// class Student
// {
// public:
//     Student(){}
//     Student(int id,const std::string& name):id(id),name(name){}
//     bool operator>(const Student& s)
//     {
//         return this->id > s.id;
//     }
//     friend std::ostream& operator<<(std::ostream& os,const Student& s);
// private:
//     int id;
//     std::string name;
// };

// std::ostream& operator<<(std::ostream& os,const Student& s)
// {
//     std::cout<<s.id<<" "<<s.name;
//     return os;
// }

// void Test(const DynamicArray<Student>& array)
// {
    
// }


class MyStringList;
//模板可以派生出普通类,只要在定义是直接明确模板的参数,该派生类不再是模板类
class StdMyString:public DynamicArray<char>
{
public:
    StdMyString ():DynamicArray(){}
    StdMyString (const char* str):DynamicArray()
    {
        while(*str != '\0')
            InsertTail(*str++);
        InsertTail('\0');
    }
    //深拷贝  赋值运算符重载——解决浅拷贝问题
    StdMyString& operator=(const StdMyString& str)
    {
        this->Clear();
        char* p = str.a;
        while(*p != '\0')
            InsertTail(*p++);
        InsertTail('\0');
        return *this;
    }
    MyStringList split(const char* delim);
};

class MyStringList:public DynamicArray<StdMyString>
{
    
};

MyStringList StdMyString::split(const char *delim)
{
    MyStringList list;
    char *ptr = strtok(this->a,delim);
    
    while (ptr != nullptr)
    {
        list.InsertTail(ptr);
        ptr = strtok(nullptr,delim);
    }
    return list;
}

int main()
{
    //类模板必须显示实例化
    // DynamicArray<Student> a;
    // a.InsertTail(Student(1,"张三"));
    // a.InsertTail(Student(2,"李四"));
    // std::cout<<a<<std::endl;
    StdMyString s("zhangsan,lisi,wangwu");
    //向上转型
    std::cout<<s.split(",")<<std::endl;
    return 0;
}


